package logica_de_negocio;

import java.util.HashSet;

import logica_de_datos.GestorBD;
import comun.CapituloVistaNoSi;

public class gestorCapituloVistaNoSi {

	private HashSet<CapituloVistaNoSi> listaCVNS;
	final GestorBD objConversor = GestorBD.getInstance();

	public gestorCapituloVistaNoSi() {

		listaCVNS = new HashSet<CapituloVistaNoSi>();

	}

	public void cargarDatos() throws ClassNotFoundException {
		
			objConversor.connect();
			listaCVNS = objConversor.listarCapituloVistaNoSi();
			objConversor.disconnect();
		
	}

	public void addCapituloVistaNoSi(CapituloVistaNoSi cvns)// OK
			throws excepAnadirDupli, FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {

		cargarDatos();

		if (listaCVNS.contains(cvns)) {
			excepAnadirDupli dupli = new excepAnadirDupli();
			dupli.setDes("El capitulo con id " + cvns.getId_c()
					+ "  ya esta marcado como visto o no visto");
			throw dupli;
		} else {
			comprovarCVNS(cvns);
			
				objConversor.connect();
				objConversor.addCapituloVistaNoSi(cvns);
				objConversor.disconnect();
			
		}
	}

	private void comprovarCVNS(CapituloVistaNoSi cvns)// OK
			throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {
		/**
		 * Comprueba que tanto en id del usuario como el del capitulo esten en
		 * la base de datos
		 */

		boolean estaC = false;
		gestorCapitulo gc = new gestorCapitulo();
		if (gc.isId(cvns.getId_c())) {
			estaC = true;
		}
		boolean estaU = false;
		gestorUsuario gu = new gestorUsuario();
		if (gu.isId(cvns.getId_u())) {
			estaU = true;
		}
		if ((estaC == false) || (estaU == false)) {
			FaltanDatosEnLaBaseDeDatos ex = new FaltanDatosEnLaBaseDeDatos();
			if (estaC == false) {
				ex.setFalta("Falta el id del Capitulo ");
			}
			if ((estaU == false) && (estaC == false)) {
				ex.setFalta(ex.getFalta() + " y ");
			}
			if (estaU == false) {
				if (ex.getFalta() == null) {
					ex.setFalta("Falta el id del usuario ");
				} else {
					ex.setFalta(ex.getFalta() + "falta el id del usuario ");
				}

			}
			ex.setFalta(ex.getFalta() + "en la Base De datos");
			throw ex;
		}
	}

	public boolean modificarCapituloVistaNoSi(CapituloVistaNoSi cvns)// OK
			throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {

		cargarDatos();
		boolean dev = false;
		if (listaCVNS.contains(cvns)) {

		
				objConversor.connect();
				objConversor.modifyCapituloVistaNoSi(cvns);
				dev = true;
				objConversor.disconnect();
			
		} else {
			FaltanDatosEnLaBaseDeDatos f = new FaltanDatosEnLaBaseDeDatos();
			f.setFalta("Usted no tiene marcado  este capitulo");
			throw f;
		}
		return dev;
	}

	public boolean deleteCapituloVistaNoSi(CapituloVistaNoSi cvns)// OK
			throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {

		cargarDatos();
		boolean dev = false;
		if (listaCVNS.contains(cvns)) {
			
				objConversor.connect();
				objConversor.deleteCapituloVistaNoSi(cvns);
				dev = true;
				objConversor.disconnect();
			
		} else {
			FaltanDatosEnLaBaseDeDatos f = new FaltanDatosEnLaBaseDeDatos();
			String vistaPara = "para ver";
			if (cvns.isVista()) {
				vistaPara = "como visto";
			}
			f.setFalta("Usted no tiene marcado " + vistaPara + " este capitulo");
			throw f;
		}
		return dev;
	}

	public boolean deleteAllCapituloVistaNoSiFromId_U(int id_u) throws ClassNotFoundException {// OK

		cargarDatos();
		boolean dev = false;

		for (CapituloVistaNoSi cvns : listaCVNS) {

			if (cvns.getId_u() == id_u) {
			
					objConversor.connect();
					objConversor.deleteCapituloVistaNoSi(cvns);
					dev = true;
					objConversor.disconnect();
				
			}
		}

		return dev;
	}

	public boolean deleteAllCapituloVistaNoSiFromId_C(int id_c) throws ClassNotFoundException {// OK

		cargarDatos();
		boolean dev = false;
		for (CapituloVistaNoSi cvns : listaCVNS) {

			if (cvns.getId_c() == id_c) {
		
					objConversor.connect();
					objConversor.deleteCapituloVistaNoSi(cvns);
					dev = true;
					objConversor.disconnect();
		
			}
		}
		return dev;
	}

	public CapituloVistaNoSi getCapituloVistaNoSi(int id_c, int id_u)// OK
			throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {

		CapituloVistaNoSi devCvns = null;
		cargarDatos();
		for (CapituloVistaNoSi cvns : listaCVNS) {
			if (cvns.getId_c() == id_c) {
				if (cvns.getId_u() == id_u) {
					devCvns = cvns;
				}
			}
		}
		if (devCvns == null) {
			FaltanDatosEnLaBaseDeDatos f = new FaltanDatosEnLaBaseDeDatos();
			f.setFalta("En la base de datos no existe la valoracion del capitulo");
			throw f;
		}
		return devCvns;

	}

	public boolean isId_c(int id_c) throws ClassNotFoundException {

		boolean dev = false;

		cargarDatos();

		for (CapituloVistaNoSi cvns : listaCVNS) {

			if (cvns.getId_c() == id_c) {
				dev = true;
			}
		}

		return dev;
	}

	public boolean anadido(CapituloVistaNoSi cvns) throws ClassNotFoundException {
		cargarDatos();
		boolean dev = false;
		dev = listaCVNS.contains(cvns);
		return dev;
	}

	public HashSet<CapituloVistaNoSi> getCapituloVistaNoSi() throws ClassNotFoundException {// OK

		cargarDatos();
		return listaCVNS;
	}

	public boolean isId_u(int id_u) throws ClassNotFoundException {
		boolean dev = false;

		cargarDatos();

		for (CapituloVistaNoSi cvns : listaCVNS) {

			if (cvns.getId_u() == id_u) {
				dev = true;
			}
		}

		return dev;
	}

	/**
	 * Indica si existen capitulos marcados como visto o pendientes en la base
	 * de datos
	 * 
	 * @return true si no hay nada en la base de datos. False si esta vacia.
	 * @throws ClassNotFoundException Error que se lanza cuando no existe la base de datos.
	 */
	public boolean estaVacia() throws ClassNotFoundException {

		boolean dev = false;
		cargarDatos();
		dev = listaCVNS.isEmpty();
		return dev;
	}

	/**
	 * Nos devuelve el id del capitulo del capitulo mas visto por los usuarios.
	 * 
	 * @return id del capitulo mas visto y 0 si no hay ninguno.
	 * @throws ClassNotFoundException Error que se lanza cuando no existe la base de datos.
	 */
	public int id_cMasVista() throws ClassNotFoundException {
		cargarDatos();
		int pos = 0;
		int[][] vecesId_c = new int[listaCVNS.size()][2]; // id_p veces
		for (CapituloVistaNoSi cvns : listaCVNS) {
			boolean esta = false;
			if (cvns.isVista()) {
				for (int i = 0; i < pos; i++) {
					if (vecesId_c[i][0] == cvns.getId_c()) {
						vecesId_c[i][1]++;
					}
				}
				if (esta == false) {
					vecesId_c[pos][0] = cvns.getId_c();
					vecesId_c[pos][1]++;
					pos++;
				}
			}
		}
		int dev = vecesId_c[0][0];
		int max = vecesId_c[0][1];
		for (int i = 0; i < pos; i++) {

			if (max <= vecesId_c[i][1]) {
				dev = vecesId_c[i][0];
			}
		}
		return dev;
	}
}